#include <iostream>
#include <signal.h>
#include "../comm/httplib.h"
#include "oj_control.hpp"

using std::string;
using namespace httplib;
using namespace ns_control;

static Control *ctrl_ptr = nullptr;

void Recovery(int signo)
{
    // 测试上线所有主机
    ctrl_ptr->RecoveryMachines();
}

int main()
{
    // 捕捉中断信号2
    signal(SIGINT, Recovery);

    Server svr;
    Control ctrl;
    ctrl_ptr = &ctrl; // 写得非常靠前，除非在 main 一开始就用 Ctrl+C 把程序打断，否则极少发生nullptr访问成员函数的情况

    // 获取所有题目的列表
    svr.Get("/all_questions", [&ctrl](const Request &req, Response &res)
            {
                string html;
                ctrl.AllQuestions(&html);
                res.set_content(html, "text/html; charset=utf-8"); });

    // 根据题目编号，获取题目的内容
    // R"()"，原始字符串
    svr.Get(R"(/question/(\d+))", [&ctrl](const Request &req, Response &res)
            {
                // 捕获题号
                string number = req.matches[1]; 
                string html;
                ctrl.Question(number, &html);
                res.set_content(html, "text/html; charset=utf-8"); });

    // 用户提交代码，判题
    svr.Post(R"(/judge/(\d+))", [&ctrl](const Request &req, Response &res)
             {
                // 捕获题号
                string number = req.matches[1]; 
                string result_json;
                ctrl.Judge(number, req.body, &result_json);
                res.set_content(result_json, "application/json; charset=utf-8"); });

    // 设置服务器的根目录
    svr.set_base_dir("./wwwroot");
    svr.listen("0.0.0.0", 8080);
    return 0;
}